#pragma once
#include"google/protobuf/service.h"
#include"muduo/net/TcpServer.h"
#include"muduo/net/EventLoop.h"
#include"muduo/net/InetAddress.h"
#include"muduo/net/TcpConnection.h"
#include<string>
#include<functional>
#include"google/protobuf/descriptor.h"
#include<unordered_map>
#include"rpcheader.pb.h"


//发布rpc服务网络对象类

class RpcProvider
{
public:
    //发布rpc方法
    void NotifyServic(google::protobuf::Service *service);
    //启动rpc服务框架，开始提供远程网络调用服务
    void Run();
private:

    //服务信息
    typedef struct ServerInfo 
    {
        //服务对象
        google::protobuf::Service* _server;
        //服务方法
        std::unordered_map<std::string,const google::protobuf::MethodDescriptor*> _method_map;
    }ServerInfo;

    //存储服务
    std::unordered_map<std::string,ServerInfo> _serverMap;


    muduo::net::EventLoop _epoll;

    //连接回调
    void Connection(const muduo::net::TcpConnectionPtr& con);

    //读写回调
    void Message(const muduo::net::TcpConnectionPtr& con,muduo::net::Buffer* buf,muduo::Timestamp receiveTime);

    //详细回调
    void sendRpcResponse(const muduo::net::TcpConnectionPtr& con,google::protobuf::Message* Response);
};

